﻿//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using FlexiCommerce.Collections;
//using FlexiCommerce.Components;
//using NUnit.Framework;

//namespace FlexiCommerce.Tests.Collections
//{
//    [TestFixture]
//    public class ItemHierarchyBuilderTests : ItemTestsBase
//    {
//        #region SetUp

//        [SetUp]
//        public override void SetUp()
//        {
//            base.SetUp();
//            BuildHierarchy();
//        }

//        private Category a, a_a, a_b, a_a_a, a_a_b, a_b_a, a_b_b;

//        private void BuildHierarchy()
//        {
//            int i = 0;
//            a = CreateOneCategory(++i, "a", null);
//            a_a = CreateOneCategory(++i, "a_a", a);
//            a_b = CreateOneCategory(++i, "a_b", a);

//            a_a_a = CreateOneCategory(++i, "a_a_a", a_a);
//            a_a_b = CreateOneCategory(++i, "a_a_b", a_a);

//            a_b_a = CreateOneCategory(++i, "a_b_a", a_b);
//            a_b_b = CreateOneCategory(++i, "a_b_b", a_b);
//        }

//        #endregion

//        [Test]
//        public void CanBuild_HierarchyBranch()
//        {
//            HierarchyNode<Category> node = new BranchHierarchyBuilder<Category>(a_a_a, null).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            Assert.AreEqual(a, ih.Current);
//            Assert.IsNull(ih.Parent);
//            EnumerableAssert.Count(5, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void CanBuild_HierarchyBranch_AndAddInitialsChildren_WithSame_InitialAsLast()
//        {
//            HierarchyNode<Category> node = new BranchHierarchyBuilder<Category>(a, a, true).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(3, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void CanBuild_HierarchyBranch_WithDifferent_InitialAsLast()
//        {
//            HierarchyNode<Category> node = new BranchHierarchyBuilder<Category>(a_a, a).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(3, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void CanBuild_HierarchyBranch_AndAddInitialsChildren_WithDifferent_InitialAsLast()
//        {
//            HierarchyNode<Category> node = new BranchHierarchyBuilder<Category>(a_a, a, true).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(5, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void CanBuild_Complete_HierarchyTree()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(7, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void CanBuild_Partial_HierarchyTree()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a_a).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(3, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void BuildHierarchyTree_OtherNodes_AreNotIncluded()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a_b).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.DoesntContain(ih.EnumerateAllItems(), a);
//            EnumerableAssert.DoesntContain(ih.EnumerateAllItems(), a_a);
//            EnumerableAssert.DoesntContain(ih.EnumerateAllItems(), a_a_a);
//        }

//        [Test]
//        public void BuildHierarchyTree_CanTree_Depth1()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a, 1).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(1, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void BuildHierarchyTree_CanTree_Depth2()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a, 2).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(3, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void BuildHierarchyTree_CanTree_Depth3()
//        {
//            HierarchyNode<Category> node = new TreeHierarchyBuilder<Category>(a, 3).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(7, ih.EnumerateAllItems());
//        }

//        [Test]
//        public void BuildHierarchyBranch_SameInitialAndLast()
//        {
//            HierarchyNode<Category> node = new BranchHierarchyBuilder<Category>(a, a).Build();
//            ItemHierarchyNavigator<Category> ih = new ItemHierarchyNavigator<Category>(node);
//            EnumerableAssert.Count(1, ih.EnumerateAllItems());
//        }
//    }
//}
